package com.twq.types.typeximplicit

/**
 * Created by tangweiqun on 2017/11/20.
 */
object TypeCaptor {
  def main(args: Array[String]): Unit = {
    //1、方法参数的类型推断, Scala类型的推断是从左到右进行推断的
    //当方法参数是分开的，编译器会根据第一个参数List("s", "", "ssss")判断类型参数的类型是String类型
    foo(List("s", "", "ssss"))(_.isEmpty)
    //因为两个参数都在同一个()中，所以类型参数还没有推断出来就编译报错
    //foo_1(List("s", "", "ssss"), _.isEmpty)

    //2、类型参数的类型推断
    //类型推断器无法通过一个参数同时找到C和A的类型，所以下面的调用会报错
    //peek(List(1, 2, 3))
    //利用隐式转换来进行类型推断
    peek_1(List(1, 2, 3))

    //<:<[C, Traversable[A]]
    // C <: Traversable[A]

  }

  def foo[A](col: List[A])(f: A => Boolean) = null

  def foo_1[A](col: List[A], f: A => Boolean) = null


  def peek[A, C <: Traversable[A]](col: C) = (col.head, col)

  def peek_1[C, A](col: C)(implicit ev: <:<[C, Traversable[A]]) = (col.head, col)

  def peek_2[C, A](col: C)(implicit ev: C <:< Traversable[A]) = (col.head, col)

}
